Перейти к основному содержимому

🧱 Зависимости и улучшение SPEC-файла

🎯 Цель раздела

В этом разделе вы:

  • научитесь описывать зависимости пакета;
  • узнаете, как работать со скриптовыми секциями (%post, %pre, %preun, %trigger);
  • освоите лучшие практики для чистого и поддерживаемого SPEC-файла.

📦 Зависимости пакета

1. BuildRequires

BuildRequires — пакеты, необходимые во время сборки. Они не попадут в итоговый RPM, но без них сборка не состоится.

BuildRequires: gcc
BuildRequires: make
BuildRequires: glibc-devel

2. Requires

Requires — пакеты, которые должны быть установлены во время работы программы.

Requires: bash
Requires: libX11

3. Автоматическое определение зависимостей

RPM способен сам определить зависимости на основе импортируемых библиотек. Тем не менее, ручное указание требуется, если:

  • пакет использует нестандартные пути,
  • библиотека не имеет .so симлинков,
  • требуется конкретная версия.
Requires: python3 >= 3.10

🧩 Пример комбинированных зависимостей

BuildRequires: gcc, make, pkgconfig(glib-2.0)
Requires: glib2 >= 2.56

Проверить зависимости можно командой:

rpm -qpR RPMS/x86_64/hello-1.0-1.x86_64.rpm

⚙️ Скриптовые секции SPEC-файла

SPEC позволяет выполнять скрипты при установке, обновлении и удалении пакета.

СекцияКогда выполняетсяПример
%preДо установкиСоздание пользователя, каталогов
%postПосле установкиЗапуск сервиса, обновление кэшей
%preunДо удаленияОстановка службы
%postunПосле удаленияОчистка временных данных
%triggerПри обновлении или пересечении с другим пакетомКастомная логика обновлений

Пример:

%post
echo "Приложение hello установлено!"

%preun
echo "Удаляется hello..."

🧰 Пример установки службы через systemd

Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd

%post
%systemd_post hello.service

%preun
%systemd_preun hello.service

%postun
%systemd_postun_with_restart hello.service

💡 Эти макросы упрощают работу с systemd и автоматизируют включение/отключение сервисов.


🧾 Улучшение SPEC-файла

Хорошо написанный SPEC:

  1. Читается человеком;
  2. Содержит минимально необходимое;
  3. Не дублирует команды, уже выполняемые по умолчанию;

Пример “чистого” SPEC

Name:           hello
Version: 1.1
Release: 2%{?dist}
Summary: Simple Hello World
License: MIT
URL: https://example.com/hello
Source0: %{name}-%{version}.tar.gz

BuildRequires: gcc, make
Requires: glibc

%description
A simple demonstration of package building for ROSA Linux.

%prep
%autosetup -n %{name}-%{version}

%build
%make_build

%install
%make_install

%files
%license LICENSE
%doc README.md
%{_bindir}/hello

%changelog
* Fri Oct 31 2025 Sergey Braumann <sergeybraumann@gmail.com> 1.1-2
- Cleaned up SPEC file and added documentation references

🧠 Макросы упрощающие жизнь

МакросЭквивалент
%autosetupРаспаковка + применение патчей
%make_buildmake -O -j$(nproc)
%make_installmake install DESTDIR=%{buildroot}
%licenseПометка файла лицензии
%docПометка документации

⚙️ Использование стандартных макросов делает SPEC-файл универсальным и совместимым с ABF.


🧩 Проверка на соответствие стандартам

Используйте rpmlint:

rpmlint SPECS/hello.spec RPMS/x86_64/hello-1.1-2.x86_64.rpm

Типичные предупреждения:

  • W: no-documentation — нет документации;
  • E: non-standard-dir-in-usr — неправильный путь установки;
  • W: no-%build-section — отсутствует сборка.

✅ Исправляйте все ошибки (E) и большинство предупреждений (W).


🧠 Мини-тест для самопроверки

ВопросОтвет
Чем отличаются Requires и BuildRequires?Первое — для установки, второе — для сборки
Для чего нужны секции %post и %preun?Для выполнения действий при установке и удалении
Как проверить зависимости готового RPM?rpm -qpR <путь>.rpm
Что делает макрос %make_install?Устанавливает файлы в %{buildroot}
Что проверяет rpmlint?Соответствие пакета правилам качества

🧭 Итого

Теперь вы:

  • умеете описывать зависимости пакета;
  • знаете, как использовать скриптовые секции;
  • владеете приёмами “чистого” SPEC-файла;
  • готовы к следующему шагу — отладке и устранению ошибок сборки.

Следующий документ — “Отладка и устранение ошибок сборки”, где вы научитесь анализировать логи, разбираться с ошибками rpmbuild и использовать инструменты mock и chroot.